"""
序列化器的作用
    -序列化
    -反序列化

定义序列化器：
1、定义类，继承自 Serializer
2、和模型类，字段名称一样
3、和模型类，字段类型一样
4、和模型类，字段选项一样

反序列化（校验，入库）
-校验
    1、字段类型，校验
    2、字段选项，校验
    3、单字段，校验（方法）
    4、多字段，校验（方法）
    5、自定义校验方法（在类外构建函数，在字段属性里加 validators = [自定义函数名]）
-入库
    1、创建新对象 create
        在序列化器重写create方法，实现数据入库
    2、更新对象 update
        调用序列化器时同时传入instance 和 data,系统自动调用序列化器中的update
        方法，需要重写update方法实现更新
read_only=True 只读，只进行序列化，不进行反序列化
"""

from rest_framework import serializers
from apps.drf_test_0Django原始restful.models import BookinfoModels

class BookInfSerizlizer(serializers.Serializer):
    """
    书籍序列化器
    """
    id = serializers.IntegerField(label='id',read_only=True)
    btitle = serializers.CharField(label='名称',max_length=20)
    bpub_date = serializers.DateField(label='发布日期')
    bread = serializers.IntegerField(label='阅读量',default=0)
    bcomment = serializers.IntegerField(label='评论量',default=0)
    is_delete = serializers.BooleanField(label='逻辑删除',default=False)


    # 1、关联英雄，主键,在一方查多方需要加上many=True，返回书籍id
    # heroinfomodels_set = serializers.PrimaryKeyRelatedField(read_only=True,many=True) #模型类的小写_set
    # 2、关联英雄，主键，返回具体书名
    heroinfomodels_set = serializers.StringRelatedField(read_only=True,many=True) #模型类的小写_set


    def validate_btitle(self, value):
        if "python" not in value:
            raise serializers.ValidationError('书籍名未包含python')
        print("单字段校验---》",value)
        return value

    def create(self, validated_data):
        print("数据入库。。。")
        return BookinfoModels.objects.create(**validated_data)




class HeroSerizlizer(serializers.Serializer):
    """
    英雄序列化器
    """
    GENDER_CHOICES = (
        (0,'male'),
        (1,'female'),
    )
    id = serializers.IntegerField(label='id',read_only=True)
    hname = serializers.CharField(max_length=20,label='名称')
    hgender = serializers.ChoiceField(choices=GENDER_CHOICES,label='性别',required=False)
    hcomment = serializers.CharField(max_length=200,allow_null=True,label='描述信息',required=False)

    # 1、关联书籍,外键。read_only=True表示只读，或者设置queryset = BookInfoModels.objects.all()
    # hbook = serializers.PrimaryKeyRelatedField(read_only=True)
    # 2、关联书籍，使用模型类__str__方法返回值
    # hbook = serializers.StringRelatedField(read_only=True)
    # 3、关联书籍，返回书籍的全部字段
    hbook = BookInfSerizlizer()